#include "bsp_epittimer.h"
#include "bsp_beep.h"
#include "bsp_led.h"
#include "bsp_int.h"


void epittimer_init(int epit, int frac, int counterValue)
{
	EPIT_Type *epit_p = NULL;

	if(frac<0 || frac > 0xFFF){
		return;
	}

	if(epit == 0)
		epit_p = EPIT1;
	else if(epit == 1)
		epit_p = EPIT2;
	else
		return ;

	/* 首先清零EPIT1->CR 控制寄存器.
	 * I.MX6U手册要求在修改EPIT定时器时钟源之前必须先去使能EPIT定时器 */
	epit_p->CR = 0x0;

	/* CLKSEL bit[25:24] EPIT时钟源选择, 1：ipg_clk */
	epit_p->CR |= (1 << 24);

	/* PRESCALAR bit[15:4] EPIT分频值，0：1分频, 66MHz/1==66MHz */
	epit_p->CR |= (frac << 4);

	/* RLD bit[3] EPIT工作模式，1：set-and-foret 模式 */
	epit_p->CR |= (1 << 3);

	/* OCIEN bit[2] EPIT输出比较中断使能，1：使能比较中断 */
	epit_p->CR |= (1 << 2);

	/* ENMODE bit[1] EPIT使能模式，1：EPIT使能是计数器值从LR寄存器获取 */
	epit_p->CR |= (1 << 1);

	/* EPITx_LR 加载值寄存器设置 */
	epit_p->LR = counterValue;

	/* EPIT_CMPR 比较值寄存器设置 */
	epit_p->CMPR = 0;

	/* 使能GIC IRQn 中断 */
	GIC_EnableIRQ(EPIT1_IRQn);

	/* 使能GIC IRQn 中断 */
	GIC_EnableIRQ(EPIT2_IRQn);

	/* 注册EPIT1比较中断 EPIT1_IRQn 的中断处理函数 */
	system_irqhandler_register(EPIT1_IRQn, eptitimer_irq_handler, NULL);

	/* 注册EPIT1比较中断 EPIT1_IRQn 的中断处理函数 */
	system_irqhandler_register(EPIT2_IRQn, eptitimer_irq_handler, NULL);

	/* 使能EPIT1 EN bit[0], 1: 是能EPIT */
	epit_p->CR |= (1 << 0);
}

void eptitimer_irq_handler(IRQn_Type irq, void *userparam)
{
	//static int beep_state = 0;
	static int led_state = 0;


	if((EPIT1->SR & (1 << 0))){		/* 判断比较中断事件发生 */
		//beep_state = !beep_state;
		//beep_switch(beep_state);

		/* 清除EPITx_ISR 中断标志位 */
		EPIT1->SR |= (1 << 0);
	}
	else if((EPIT2->SR & (1 << 0)))
	{

		led_state = !led_state;
		led_switch(LED_0, led_state);

		/* 清除EPITx_ISR 中断标志位 */
		EPIT2->SR |= (1 << 0);
	}
}

